<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            分别使用ES5的原型链继承 和 ES6的Class类继承完成下面要求：
            父：动物(Zoon) 内有属性：name和color  方法：eat()
            子：狗(Dog)继承动物(Zoon)  内有属性：name、color和age 方法: say()
            实例化 Dog，并调用 eat()和say()方法测试：
        */


        //2. 使用ES6标准实现：
        class Zoon {
            // 构造方法
            constructor(name, color){
                this.name = name;
                this.color = color;
            }
            // 普通方法
            eat(){
                return this.name + "爱吃肉！"; 
            }
        }
        // 声明子类Dog，并继承父类Zoon
        class Dog extends Zoon {
            // 构造方法
            constructor(name, color, age){
                super(name,color); // 调用父类的构造方法
                this.age = age;
            }
            say(){
                return  this.name + "在说 旺旺！";
            }
        }

        // 测试
        const dog = new Dog("大黄", "黄色", 3);
        console.log(dog);
        console.log(dog.eat());
        console.log(dog.say());
        const dog2 = new Dog("旺财", "白色", 3);
        // 两个对象独立创建，非同一个对象，所有下面比较是不同的
        console.log(dog === dog2); // false
        // 但是不同的对象，它们的方法应该是同一个，所有是相等的。
        console.log(dog.say === dog2.say); // true
        /*
        //1。 ES5的标准：
        // 声明Zoon的构造函数
        function Zoon(name, color){
            this.name = name;
            this.color = color;
        }
        // 为构造函数的原型对象添加方法
        Zoon.prototype.eat = function(){
            return this.name + "爱吃肉！"; 
        }

        // 声明一个Dog构造函数
        function Dog(name, color, age){
            Zoon.call(this, name, color);
            this.age = age;
        }
        // 通过原型链实现Dog对Zoon的继承
        Dog.prototype = new Zoon();
        Dog.prototype.constructor = Dog;
        // 为Dog的原型对象添加 say方法
        Dog.prototype.say = function(){
            return this.name + " 旺旺！";
        }
        // 测试
        const dog = new Dog("旺财", "白色", 3);
        console.log(dog);
        console.log(dog.eat());
        console.log(dog.say());
        */
    </script>
</body>
</html>